Skip to content

Move base64Encode into react/utils#55873

Closed
huntie wants to merge 1 commit intofacebook:mainfrom
huntie:export-D95041544
Closed

Move base64Encode into react/utils#55873
huntie wants to merge 1 commit intofacebook:mainfrom
huntie:export-D95041544

Conversation

@huntie
Copy link
Copy Markdown
Member

@huntie huntie commented Mar 3, 2026

Summary:
Move base64Encode implementation (originally vendored in D58323859) into ReactCommon/react/utils/ for reuse in other C++ packages.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D95041544

Summary:
Move `base64Encode` implementation (originally vendored in D58323859) into `ReactCommon/react/utils/` for reuse in other C++ packages.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D95041544
@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 3, 2026
@meta-codesync
Copy link
Copy Markdown

meta-codesync Bot commented Mar 3, 2026

@huntie has exported this pull request. If you are a Meta employee, you can view the originating Diff in D95041544.

@meta-codesync meta-codesync Bot closed this in 422770d Mar 3, 2026
@facebook-github-bot facebook-github-bot added the Merged This PR has been merged. label Mar 3, 2026
@meta-codesync
Copy link
Copy Markdown

meta-codesync Bot commented Mar 3, 2026

This pull request has been merged in 422770d.

@react-native-bot
Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @huntie in 422770d

When will my fix make it into a release? | How to file a pick request?

@huntie huntie deleted the export-D95041544 branch March 3, 2026 18:03
zoontek pushed a commit to zoontek/react-native that referenced this pull request Mar 9, 2026
Summary:
Pull Request resolved: facebook#55873

Move `base64Encode` implementation (originally vendored in D58323859) into `ReactCommon/react/utils/` for reuse in other C++ packages.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D95041544

fbshipit-source-id: d71376d03079a8cc4d0a6c3652c40d73374858ea
huntie added a commit to huntie/react-native that referenced this pull request Mar 31, 2026
Summary:
Pull Request resolved: facebook#55873

Move `base64Encode` implementation (originally vendored in D58323859) into `ReactCommon/react/utils/` for reuse in other C++ packages.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D95041544

fbshipit-source-id: d71376d03079a8cc4d0a6c3652c40d73374858ea
huntie pushed a commit to huntie/react-native that referenced this pull request Apr 8, 2026
Backports some CDP Performance features and stability improvements to `0.83-stable`.

This includes:
- Remaining implementation of Frame Timings and screenshot capture in performance traces (Android)
- New support for Frame Timings and screenshot capture on iOS
- Optimisations to trace chunk generation, memory usage during performance recording
- `Page.captureScreenshot` (Android, iOS)

All features remain gated behind feature flags (`fuseboxFrameRecordingEnabled`, `fuseboxScreenshotCaptureEnabled`).

**Commits applied**

- Define TracingCategory enum (facebook#54377) bd6c6bf
- Use TracingCategory in TraceEvent (facebook#54378) ce60f27
- Simple parser for serialized tracing categories (facebook#54379) 62275b6
- Propagate tracing categories to recording state (facebook#54380) 3841ef0
- Re-land "Revert D85999774: [rn][android] Add FrameTiming module" (facebook#54502) 85905ad
- Add screenshot category (facebook#54537) 5d9cb80
- Define HostTargetTracingDelegate (facebook#54622) be0dae0
- Define TracingDelegate for Android Host (facebook#54628) a212e95
- Use new API for tracing state on Android (facebook#54629) 532d0be
- Internalize TracingState interface (facebook#54631) 58ec261
- Move TracingState interfaces to inspector package (facebook#54632) 10d0d99
- Rename values of TracingState enum (facebook#54630) be94707
- FrameTiming module to subscribe to Inspector tracing lifecycle (facebook#54633) 04ee02b
- Clarify HostTracingProfile and HostTraceRecordingState (facebook#54677) ec92f12
- Introduce TimeWindowedBuffer (facebook#54679) d6ee54f
- Keep tracing time window on TraceRecordingState (facebook#54673) e651563
- Define FrameTimingSequence (facebook#54674) 5b7d92f
- Define an endpoint on HostTarget to capture frame timings (facebook#54672) f469aa3
- Extract frame trace events construction logic (facebook#54675) 57973fa
- Define serializers for frame timings as part of HostTargetTracingProfile (facebook#54681) 587d360
- Propagate Frames data through Host (facebook#54671) 26ff069
- Cleanup no longer used jni layer for frame timings (facebook#54678) 9ba4ce6
- Fix screenshot typo (facebook#54742) 52186a3
- Add optional screenshot argument to FrameTimingSequence (facebook#54743) 57c29fc
- Frame screenshot event generation (facebook#54744) b447d26
- Frame screenshots capture implementation (facebook#54745) f3c9a8d
- BeginDrawing: INTENDED_VSYNC_TIMESTAMP -> VSYNC_TIMESTAMP (facebook#54765) 9221772
- Add frames category (facebook#54768) 31a0c9a
- Specify correct category for SetLayerTreeId event (facebook#54769) cd055e9
- Reduce the screenshots size (facebook#54800) e4a5a56
- Remove Commit from FrameTimingSequence (facebook#54779) 39f7703
- Fix potential bitmap leaks in FrameTimingsObserver (facebook#55652) 3918dd1
- Capture initial screenshot when starting frame timing trace (facebook#55720) 863f5c0
- Refactor FrameTimingsObserver for multi-activity support (facebook#55740) 8230f3b
- Reorder FrameTimingsObserver methods (facebook#55743) f56b295
- Increase frame capture quality, apply scaling after DPI normalization (facebook#55731) e5f9f5f
- Fix FrameTimingsObverver to initiate PixelCopy on main thread (facebook#55744) d552f2a
- Fix bitmap reuse race condition in FrameTimingsObserver (facebook#55745) 3924768
- Fix trailing frame capture after recording ended (facebook#55704) 47684ca
- Move base64Encode into react/utils (facebook#55873) 422770d
- Move screenshot Base64 encoding to trace serialization (facebook#55803) dc4c36e
- Restore inspector addPage listener callback (facebook#55925) 8c763fc
- Add tracing helper functions for RNDT traces in C++ and Kotlin (facebook#55935) 4f3f536
- Introduce fuseboxFrameRecordingEnabled flag, gate existing code (facebook#55941) 1aa7a32
- Implement Performance frames and screenshots on iOS (facebook#56015) 64a1a10
- Add pixel diffing to RCTFrameTimingsObserver (facebook#56043) 9d231af
- Add dynamic sampling to frame screenshots (facebook#56048) d309cda
- Switch trace event chunks from event count to size based (facebook#56080) d3b33f5
- Increase trace screenshot scale factor to 1x (facebook#56079) 972a30d
- Add Page.captureScreenshot CDP support (facebook#56307) 77332d2
- Fix data race on PerformanceObserver entry buffer (facebook#56352) 5eb1ca1
- [LOCAL] Remove stale frame event code from PerformanceTracer
- [LOCAL] Update Podfile.lock
huntie pushed a commit to huntie/react-native that referenced this pull request Apr 8, 2026
Backports some CDP Performance features and stability improvements to `0.83-stable`.

This includes:
- Remaining implementation of Frame Timings and screenshot capture in performance traces (Android)
- New support for Frame Timings and screenshot capture on iOS
- Optimisations to trace chunk generation, memory usage during performance recording
- `Page.captureScreenshot` (Android, iOS)

All features remain gated behind feature flags (`fuseboxFrameRecordingEnabled`, `fuseboxScreenshotCaptureEnabled`).

**Commits applied**

- Define TracingCategory enum (facebook#54377) bd6c6bf
- Use TracingCategory in TraceEvent (facebook#54378) ce60f27
- Simple parser for serialized tracing categories (facebook#54379) 62275b6
- Propagate tracing categories to recording state (facebook#54380) 3841ef0
- Re-land "Revert D85999774: [rn][android] Add FrameTiming module" (facebook#54502) 85905ad
- Add screenshot category (facebook#54537) 5d9cb80
- Define HostTargetTracingDelegate (facebook#54622) be0dae0
- Define TracingDelegate for Android Host (facebook#54628) a212e95
- Use new API for tracing state on Android (facebook#54629) 532d0be
- Internalize TracingState interface (facebook#54631) 58ec261
- Move TracingState interfaces to inspector package (facebook#54632) 10d0d99
- Rename values of TracingState enum (facebook#54630) be94707
- FrameTiming module to subscribe to Inspector tracing lifecycle (facebook#54633) 04ee02b
- Clarify HostTracingProfile and HostTraceRecordingState (facebook#54677) ec92f12
- Introduce TimeWindowedBuffer (facebook#54679) d6ee54f
- Keep tracing time window on TraceRecordingState (facebook#54673) e651563
- Define FrameTimingSequence (facebook#54674) 5b7d92f
- Define an endpoint on HostTarget to capture frame timings (facebook#54672) f469aa3
- Extract frame trace events construction logic (facebook#54675) 57973fa
- Define serializers for frame timings as part of HostTargetTracingProfile (facebook#54681) 587d360
- Propagate Frames data through Host (facebook#54671) 26ff069
- Cleanup no longer used jni layer for frame timings (facebook#54678) 9ba4ce6
- Fix screenshot typo (facebook#54742) 52186a3
- Add optional screenshot argument to FrameTimingSequence (facebook#54743) 57c29fc
- Frame screenshot event generation (facebook#54744) b447d26
- Frame screenshots capture implementation (facebook#54745) f3c9a8d
- BeginDrawing: INTENDED_VSYNC_TIMESTAMP -> VSYNC_TIMESTAMP (facebook#54765) 9221772
- Add frames category (facebook#54768) 31a0c9a
- Specify correct category for SetLayerTreeId event (facebook#54769) cd055e9
- Reduce the screenshots size (facebook#54800) e4a5a56
- Remove Commit from FrameTimingSequence (facebook#54779) 39f7703
- Fix potential bitmap leaks in FrameTimingsObserver (facebook#55652) 3918dd1
- Capture initial screenshot when starting frame timing trace (facebook#55720) 863f5c0
- Refactor FrameTimingsObserver for multi-activity support (facebook#55740) 8230f3b
- Reorder FrameTimingsObserver methods (facebook#55743) f56b295
- Increase frame capture quality, apply scaling after DPI normalization (facebook#55731) e5f9f5f
- Fix FrameTimingsObverver to initiate PixelCopy on main thread (facebook#55744) d552f2a
- Fix bitmap reuse race condition in FrameTimingsObserver (facebook#55745) 3924768
- Fix trailing frame capture after recording ended (facebook#55704) 47684ca
- Move base64Encode into react/utils (facebook#55873) 422770d
- Move screenshot Base64 encoding to trace serialization (facebook#55803) dc4c36e
- Restore inspector addPage listener callback (facebook#55925) 8c763fc
- Add tracing helper functions for RNDT traces in C++ and Kotlin (facebook#55935) 4f3f536
- Introduce fuseboxFrameRecordingEnabled flag, gate existing code (facebook#55941) 1aa7a32
- Implement Performance frames and screenshots on iOS (facebook#56015) 64a1a10
- Add pixel diffing to RCTFrameTimingsObserver (facebook#56043) 9d231af
- Add dynamic sampling to frame screenshots (facebook#56048) d309cda
- Switch trace event chunks from event count to size based (facebook#56080) d3b33f5
- Increase trace screenshot scale factor to 1x (facebook#56079) 972a30d
- Add Page.captureScreenshot CDP support (facebook#56307) 77332d2
- Fix data race on PerformanceObserver entry buffer (facebook#56352) 5eb1ca1
- [LOCAL] Remove stale frame event code from PerformanceTracer
- [LOCAL] Update Podfile.lock
huntie added a commit to huntie/react-native that referenced this pull request Apr 9, 2026
Backports some CDP Performance features and stability improvements to `0.83-stable`.

This includes:
- Remaining implementation of Frame Timings and screenshot capture in performance traces (Android)
- New support for Frame Timings and screenshot capture on iOS
- Optimisations to trace chunk generation, memory usage during performance recording
- `Page.captureScreenshot` (Android, iOS)

All features remain gated behind feature flags (`fuseboxFrameRecordingEnabled`, `fuseboxScreenshotCaptureEnabled`).

**Commits applied**

- Define TracingCategory enum (facebook#54377) bd6c6bf
- Use TracingCategory in TraceEvent (facebook#54378) ce60f27
- Simple parser for serialized tracing categories (facebook#54379) 62275b6
- Propagate tracing categories to recording state (facebook#54380) 3841ef0
- Re-land "Revert D85999774: [rn][android] Add FrameTiming module" (facebook#54502) 85905ad
- Add screenshot category (facebook#54537) 5d9cb80
- Define HostTargetTracingDelegate (facebook#54622) be0dae0
- Define TracingDelegate for Android Host (facebook#54628) a212e95
- Use new API for tracing state on Android (facebook#54629) 532d0be
- Internalize TracingState interface (facebook#54631) 58ec261
- Move TracingState interfaces to inspector package (facebook#54632) 10d0d99
- Rename values of TracingState enum (facebook#54630) be94707
- FrameTiming module to subscribe to Inspector tracing lifecycle (facebook#54633) 04ee02b
- Clarify HostTracingProfile and HostTraceRecordingState (facebook#54677) ec92f12
- Introduce TimeWindowedBuffer (facebook#54679) d6ee54f
- Keep tracing time window on TraceRecordingState (facebook#54673) e651563
- Define FrameTimingSequence (facebook#54674) 5b7d92f
- Define an endpoint on HostTarget to capture frame timings (facebook#54672) f469aa3
- Extract frame trace events construction logic (facebook#54675) 57973fa
- Define serializers for frame timings as part of HostTargetTracingProfile (facebook#54681) 587d360
- Propagate Frames data through Host (facebook#54671) 26ff069
- Cleanup no longer used jni layer for frame timings (facebook#54678) 9ba4ce6
- Fix screenshot typo (facebook#54742) 52186a3
- Add optional screenshot argument to FrameTimingSequence (facebook#54743) 57c29fc
- Frame screenshot event generation (facebook#54744) b447d26
- Frame screenshots capture implementation (facebook#54745) f3c9a8d
- BeginDrawing: INTENDED_VSYNC_TIMESTAMP -> VSYNC_TIMESTAMP (facebook#54765) 9221772
- Add frames category (facebook#54768) 31a0c9a
- Specify correct category for SetLayerTreeId event (facebook#54769) cd055e9
- Reduce the screenshots size (facebook#54800) e4a5a56
- Remove Commit from FrameTimingSequence (facebook#54779) 39f7703
- Fix potential bitmap leaks in FrameTimingsObserver (facebook#55652) 3918dd1
- Capture initial screenshot when starting frame timing trace (facebook#55720) 863f5c0
- Refactor FrameTimingsObserver for multi-activity support (facebook#55740) 8230f3b
- Reorder FrameTimingsObserver methods (facebook#55743) f56b295
- Increase frame capture quality, apply scaling after DPI normalization (facebook#55731) e5f9f5f
- Fix FrameTimingsObverver to initiate PixelCopy on main thread (facebook#55744) d552f2a
- Fix bitmap reuse race condition in FrameTimingsObserver (facebook#55745) 3924768
- Fix trailing frame capture after recording ended (facebook#55704) 47684ca
- Move base64Encode into react/utils (facebook#55873) 422770d
- Move screenshot Base64 encoding to trace serialization (facebook#55803) dc4c36e
- Restore inspector addPage listener callback (facebook#55925) 8c763fc
- Add tracing helper functions for RNDT traces in C++ and Kotlin (facebook#55935) 4f3f536
- Introduce fuseboxFrameRecordingEnabled flag, gate existing code (facebook#55941) 1aa7a32
- Implement Performance frames and screenshots on iOS (facebook#56015) 64a1a10
- Add pixel diffing to RCTFrameTimingsObserver (facebook#56043) 9d231af
- Add dynamic sampling to frame screenshots (facebook#56048) d309cda
- Switch trace event chunks from event count to size based (facebook#56080) d3b33f5
- Increase trace screenshot scale factor to 1x (facebook#56079) 972a30d
- Add Page.captureScreenshot CDP support (facebook#56307) 77332d2
- Fix data race on PerformanceObserver entry buffer (facebook#56352) 5eb1ca1
- Add dynamic sampling to frame screenshots (facebook#56135) e0d1e29
- Increase trace screenshot scale factor to 1x (facebook#56136) 90e02fa
- Add missing debugger define for React-RuntimeApple (facebook#56397)
- [LOCAL] Remove stale frame event code from PerformanceTracer
- [LOCAL] Update Podfile.lock
gabrieldonadel pushed a commit that referenced this pull request Apr 13, 2026
Backports some CDP Performance features and stability improvements to `0.83-stable`.

This includes:
- Remaining implementation of Frame Timings and screenshot capture in performance traces (Android)
- New support for Frame Timings and screenshot capture on iOS
- Optimisations to trace chunk generation, memory usage during performance recording
- `Page.captureScreenshot` (Android, iOS)

All features remain gated behind feature flags (`fuseboxFrameRecordingEnabled`, `fuseboxScreenshotCaptureEnabled`).

**Commits applied**

- Define TracingCategory enum (#54377) bd6c6bf
- Use TracingCategory in TraceEvent (#54378) ce60f27
- Simple parser for serialized tracing categories (#54379) 62275b6
- Propagate tracing categories to recording state (#54380) 3841ef0
- Re-land "Revert D85999774: [rn][android] Add FrameTiming module" (#54502) 85905ad
- Add screenshot category (#54537) 5d9cb80
- Define HostTargetTracingDelegate (#54622) be0dae0
- Define TracingDelegate for Android Host (#54628) a212e95
- Use new API for tracing state on Android (#54629) 532d0be
- Internalize TracingState interface (#54631) 58ec261
- Move TracingState interfaces to inspector package (#54632) 10d0d99
- Rename values of TracingState enum (#54630) be94707
- FrameTiming module to subscribe to Inspector tracing lifecycle (#54633) 04ee02b
- Clarify HostTracingProfile and HostTraceRecordingState (#54677) ec92f12
- Introduce TimeWindowedBuffer (#54679) d6ee54f
- Keep tracing time window on TraceRecordingState (#54673) e651563
- Define FrameTimingSequence (#54674) 5b7d92f
- Define an endpoint on HostTarget to capture frame timings (#54672) f469aa3
- Extract frame trace events construction logic (#54675) 57973fa
- Define serializers for frame timings as part of HostTargetTracingProfile (#54681) 587d360
- Propagate Frames data through Host (#54671) 26ff069
- Cleanup no longer used jni layer for frame timings (#54678) 9ba4ce6
- Fix screenshot typo (#54742) 52186a3
- Add optional screenshot argument to FrameTimingSequence (#54743) 57c29fc
- Frame screenshot event generation (#54744) b447d26
- Frame screenshots capture implementation (#54745) f3c9a8d
- BeginDrawing: INTENDED_VSYNC_TIMESTAMP -> VSYNC_TIMESTAMP (#54765) 9221772
- Add frames category (#54768) 31a0c9a
- Specify correct category for SetLayerTreeId event (#54769) cd055e9
- Reduce the screenshots size (#54800) e4a5a56
- Remove Commit from FrameTimingSequence (#54779) 39f7703
- Fix potential bitmap leaks in FrameTimingsObserver (#55652) 3918dd1
- Capture initial screenshot when starting frame timing trace (#55720) 863f5c0
- Refactor FrameTimingsObserver for multi-activity support (#55740) 8230f3b
- Reorder FrameTimingsObserver methods (#55743) f56b295
- Increase frame capture quality, apply scaling after DPI normalization (#55731) e5f9f5f
- Fix FrameTimingsObverver to initiate PixelCopy on main thread (#55744) d552f2a
- Fix bitmap reuse race condition in FrameTimingsObserver (#55745) 3924768
- Fix trailing frame capture after recording ended (#55704) 47684ca
- Move base64Encode into react/utils (#55873) 422770d
- Move screenshot Base64 encoding to trace serialization (#55803) dc4c36e
- Restore inspector addPage listener callback (#55925) 8c763fc
- Add tracing helper functions for RNDT traces in C++ and Kotlin (#55935) 4f3f536
- Introduce fuseboxFrameRecordingEnabled flag, gate existing code (#55941) 1aa7a32
- Implement Performance frames and screenshots on iOS (#56015) 64a1a10
- Add pixel diffing to RCTFrameTimingsObserver (#56043) 9d231af
- Add dynamic sampling to frame screenshots (#56048) d309cda
- Switch trace event chunks from event count to size based (#56080) d3b33f5
- Increase trace screenshot scale factor to 1x (#56079) 972a30d
- Add Page.captureScreenshot CDP support (#56307) 77332d2
- Fix data race on PerformanceObserver entry buffer (#56352) 5eb1ca1
- Add dynamic sampling to frame screenshots (#56135) e0d1e29
- Increase trace screenshot scale factor to 1x (#56136) 90e02fa
- Add missing debugger define for React-RuntimeApple (#56397)
- [LOCAL] Remove stale frame event code from PerformanceTracer
- [LOCAL] Update Podfile.lock
fabriziocucci pushed a commit that referenced this pull request May 1, 2026
* Move base64Encode into react/utils (#55873)

Summary:
Pull Request resolved: #55873

Move `base64Encode` implementation (originally vendored in D58323859) into `ReactCommon/react/utils/` for reuse in other C++ packages.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D95041544

fbshipit-source-id: d71376d03079a8cc4d0a6c3652c40d73374858ea

* Move screenshot Base64 encoding to trace serialization (#55803)

Summary:
Pull Request resolved: #55803

Refactor Android FrameTimings to reduce memory usage in trace buffer. Binary data instead of Base64 should be ~25% smaller, and eliminates string copies during JNI transfer.

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D94657907

fbshipit-source-id: c4a183ff00c519fd1545992340fd445530abab99

* Add tracing helper functions for RNDT traces in C++ and Kotlin (#55935)

Summary:
Pull Request resolved: #55935

Changelog: [internal]

This diff adds helper functions to the PerformanceTracer class for tracing performance events in React Native Developer Tools traces.

In Kotlin, new `trace` method overloads are added to `PerformanceTracer` that wrap a block of code and automatically measure and report its execution time. These use a try/finally pattern to ensure timing is captured correctly.

In C++, a new `PerformanceTracerSection` RAII class is added that automatically reports timing when the section goes out of scope. It supports optional track, track group, and color parameters, as well as variadic key-value properties for additional metadata.

Reviewed By: sammy-SC

Differential Revision: D92061513

fbshipit-source-id: 92c745426c6a9e3a2eee1e85e2a2d7fd12d88ef6

* Introduce fuseboxFrameRecordingEnabled flag, gate existing code (#55941)

Summary:
Pull Request resolved: #55941

Replaces the previous `globalThis.enableTimelineFrames` setup with backend gating.

Enables us to:
- Iterate more safely by gating Android/iOS/C++ code
- Have a per-app rollout at Meta

Changelog: [Internal]

Reviewed By: vzaidman

Differential Revision: D95405444

fbshipit-source-id: 0c41f10059b28ed940a12a44707946baa310bdfb

* Implement Performance frames and screenshots on iOS (#56015)

Summary:
Pull Request resolved: #56015

Implements CDP support for the Chrome DevTools Frames track on iOS during a performance trace, including screenshot capture.

This initial version matches the corresponding implementation for Android:

- Captures the key window.
- Always emits an initial frame.
- Resizes screenshots at 0.75 scale factor (normalized for device screen DPI) and 80% JPEG compression.
- Uses a background thread queue for image resizing.

**To dos**

- [ ] Emit frames only when there is a visual update.
- [ ] Dynamic frame sampling on slower devices (planned for Android).

**Limitations**

- Not a true screen recording, uses `UIGraphicsImageRenderer`.
  - Requires no permission prompt ✅
  - This can mean empty data (a black screen) is sent during states such as system alert dialogs being presented.
- Like Android, if the background queue builds (on slower hardware), screenshot data can be lost when the recording is ended.

This feature is gated behind the `fuseboxFrameRecordingEnabled` flag.

Changelog: [Internal]

Reviewed By: sbuggay

Differential Revision: D95566220

fbshipit-source-id: c87f1b6d8334b45e2eb67334a5f0f924d20901ec

* Add pixel diffing to RCTFrameTimingsObserver (#56043)

Summary:
Pull Request resolved: #56043

Use pixel hash comparison to avoid encoding duplicate screenshots on iOS, reducing overhead when frames don't change. Matches Android behaviour.

- Samples every 64th pixel with a fast FNV-1a hash (~0.1ms on main thread).
- Skips JPEG encoding and CDP transport entirely for unchanged frames — the dominant per-frame cost.

**Why this approach**

Attempted `CATransaction` completion blocks, however these fire on commits that produce no visual change. No other public API on iOS.

Changelog: [Internal]

Reviewed By: sbuggay

Differential Revision: D95981881

fbshipit-source-id: 76f492f0ceb6b3efea3fce822036ed6cb6067b83

* Add dynamic sampling to frame screenshots (#56048)

Summary:
Pull Request resolved: #56048

Update Android frame screenshot processing to skip screenshot capture when encoding is already in progress — now limited to a single background thread — while always emitting frame timing events.

**Motivation**

1. Prevents truncated trace data on slower devices (e.g. missing screenshots for the last 1/3 of the trace), with the tradeoff of some intermediate frame screenshot loss.
2. Reduces total recording overhead by freeing up device threads - prevents excessive encoding work from blocking or slowing down the UI and other app threads.

**Algorithm**

Uses `encodingInProgress` atomic flag with single encoding thread and `lastFrameBuffer` storage for tail-capture of the last frame before idling (to capture settled animation states):

- **Not encoding:** Frame passes directly to encoder → emits with screenshot when done
- **Encoding busy:** Frame stored in `lastFrameBuffer` for tail-capture → any replaced frame emits without screenshot
- **Encoding done:** Clears flag early, then opportunistically encodes tail frame without blocking new frames
- **Failed captures:** Emit without screenshot immediately

Result: Every frame emitted exactly once. Encoding adapts to device speed. Settled animation state guaranteed captured.

**Remaining work**

- ⚠️ This still does not yet solve crashes (OkHttp network chunk size overflow) for heavy frame data at a high FPS on fast devices (coming next).

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D95987488

fbshipit-source-id: cda5758e3091edd227d3838638ba157dbcea52d8

* Switch trace event chunks from event count to size based (#56080)

Summary:
Pull Request resolved: #56080

Trace event chunks were previously split by a fixed event count (1000). This caused issues with Frame Timing events containing screenshot data, where a single chunk could produce CDP messages of tens or hundreds of MBs — exceeding the OkHttp WebSocket limit (app crash).

Address this problem by replacing count-based chunking with size-based chunking (max 10 MiB per chunk) for `emitFrameTimings()` and `emitPerformanceTraceEvents()`. A new `TraceEventSerializer::estimateJsonSize()` utility recursively estimates the serialized byte size of a `folly::dynamic` value to avoid double-serialization overhead.

**Notes**

  - RuntimeSamplingProfile chunks (separate code path) remain count-based (inherently small, no screenshot data).

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D96206962

fbshipit-source-id: 6b6e4db76441f174c46bf34905292585d0e30899

* Increase trace screenshot scale factor to 1x (#56079)

Summary:
Pull Request resolved: #56079

Stacked on the current set of improvements, now further increase screenshot quality on Android.

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D96382172

fbshipit-source-id: 1f850d249142a7438eb0064194fac16ce6c9ae89

* Add Page.captureScreenshot CDP support (#56307)

Summary:
Pull Request resolved: #56307

Implement the `Page.captureScreenshot` CDP command in the inspector backend, allowing DevTools to capture an on-demand screenshot of the current app view. This is a minimal implementation supporting only the `format` (jpeg/png/webp) and `quality` (0-100, jpeg only) parameters, returning base64-encoded image data.

The feature is gated behind a new `fuseboxCaptureScreenshotEnabled` React Native feature flag, wired through `InspectorFlags` following the same pattern as frame recording.

**Motivation**

Improve agent verification / user feedback during AI sessions. We've proven that screenshots (in performance traces) are useful for understanding how components render on screen, and exposing this as an on-demand CDP method is relatively cheap today vs the larger task of modelling the DOM (Elements panel).

**Changes**

- New `fuseboxCaptureScreenshotEnabled` feature flag + `InspectorFlags` wiring (C++, Android JNI, Kotlin)
- `HostTargetDelegate::captureScreenshot()` virtual method with async callback
- C++ CDP handler in `HostAgent` — parses `format`/`quality`, delegates to platform, sends async CDP response (gated by flag)
- iOS (`RCTHost.mm`): Captures key window via `UIGraphicsImageRenderer` + `drawViewHierarchyInRect`, encodes to PNG/JPEG
- Android (`ReactHostImpl.kt`): Captures decor view via `Bitmap` + `Canvas` + `View.draw()`, encodes to PNG/JPEG/WebP
- 4 C++ tests: success, failure, param forwarding, flag-disabled rejection

Changelog: [Internal]

Reviewed By: hoxyq

Differential Revision: D99099930

fbshipit-source-id: d4d2ef86ba20d2ee230903e152dd21e11f29cbb8

* Fix data race on PerformanceObserver entry buffer (#56352)

Summary:
Pull Request resolved: #56352

Add mutex to protect `PerformanceObserver::buffer_` and `didScheduleFlushBuffer_`, which can be accessed concurrently from a background thread (`handleEntry`) and JS thread (`takeRecords`).

Fixes T263429319.

Changelog: [Internal]

Reviewed By: jorge-cab

Differential Revision: D99820359

fbshipit-source-id: 068fa1871b3a0feeb84b950b0c8f5fe7dcf38b7d

* Add dynamic sampling to frame screenshots (#56135)

Summary:
Pull Request resolved: #56135

Ports the dynamic sampling algorithm from Android (D95987488) to iOS. Uses an `encodingInProgress` atomic flag with a single encoding thread and `lastFrameData` buffer to skip screenshot encoding when the encoder is busy, while always emitting frame timing events. This prevents truncated trace data on slower devices and reduces recording overhead.

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D97131485

fbshipit-source-id: 5c30f1052d5b5a61f27f2ab90946ef47b8b6b279

* Increase trace screenshot scale factor to 1x (#56136)

Summary:
Pull Request resolved: #56136

Following D97131485, brings iOS screenshot recording to parity with Android.

NOTE: Dynamic frame sampling (D97131485) becomes more load bearing after this change, as a 1x scale increases processing overhead significantly. Let's continue dogfooding.

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D97131484

fbshipit-source-id: 4c03842ae22b905a50f989ff68fece7acc289a67

* Add missing debugger define for React-RuntimeApple (#56397)

Summary:
Pull Request resolved: #56397

The `React-RuntimeApple` pod/target was missing the `REACT_NATIVE_DEBUGGER_ENABLED` preprocessor define in both open source build configurations.

Without this, the experimental-and-flagged `fuseboxFrameRecordingEnabled` feature (D95566220) was misbehaving on iOS — code paths in `RCTHost.mm` were unexpectedly compiled out.

See #56372.

Changelog: [Internal]

Reviewed By: rubennorte

Differential Revision: D100157250

fbshipit-source-id: 8c11287f34ac6029dd1153a01fed6ba93cc7d398

---------

Co-authored-by: Alex Hunt <huntie@meta.com>
Co-authored-by: Rubén Norte <rubennorte@meta.com>
@react-native-bot
Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @motiz88 in 691b232

When will my fix make it into a release? | How to file a pick request?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported Merged This PR has been merged. meta-exported p: Facebook Partner: Facebook Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants